/**
 * Framework Tec - PassagerStresse
 *
 * @author Salma El Mohib && Sara Rahhali
 * @since 2011
 **/


package tec;


import java.lang.String;
// Délaration de la classe abstraite.
abstract class PassagerAbstrait implements Passager, Usager {
   private String Nom;
   private EtatPassager etat;
   private long Destination;

   public PassagerAbstrait (String nom, int destination) {
      Nom = new String (nom);
      Destination = destination;
      etat = EtatPassager.Dehors ();
   }

   //Fournit l'information destination.
   protected long getDestination(){
       //retourne la destination.
       return Destination;
   } 

   protected void setEtat(EtatPassager e){
     etat = e;
   }

   // Fournit le nom de l'usager.
   public final String nom () {
      // retourne une copy de this.Nom ... 
      return new String (Nom);
   }

   // Change l'etat du passager en assis.
   public final void accepterPlaceAssise () {
      etat = EtatPassager.Assis ();
   }

   // Change l'etat du passager en debout.
   public final void accepterPlaceDebout () {
      etat = EtatPassager.Debout ();
	}
   
   // Change l'etat du passager en hors du bus.
   public final void accepterSortie () {
      etat = EtatPassager.Dehors ();
	}

   // Retourne vrai si le passager est assis dans le bus.
   public final boolean estAssis () {
      return etat.estAssis ();
	}

   // Retourne vrai si le passager est debout dans le bus.
   public final boolean estDebout () {
      return etat.estDebout ();
	}

   // Retourne vrai si le passager est hors du bus.
   public final boolean estDehors () {
      return etat.estExterieur ();
	}
 
   public final void monterDans (Transport t) {
      Bus b = (Bus) t;
      choixPlaceMontee (b);  
	}

   // Indique au passager qu'il est arrive a un nouvel arret.
   public final void nouvelArret (Bus b, int arret) {
      if (getDestination() == arret) {
         setEtat(EtatPassager.Dehors ());
         b.demanderSortie (this);
      } else {
		choixChangerPlace(b, arret);
      }
   }    

   abstract protected void choixPlaceMontee (Bus b);
   
   abstract protected void choixChangerPlace (Bus b, int arret);
   
}

